#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QSortFilterProxyModel>

#include "umsdatabase.h"
#include "querywidget.h"
#include "structwidget.h"
#include "userwidget.h"


class QStandardItemModel;
class QStandardItem;
class QDomElement;
class QLabel;


class FirstTabWidget: public QTabWidget
{
	public:
		FirstTabWidget(QWidget *p);
	
		void removeTab(int index);
};
#include "ui_mainwindow.h"
class MainWindow : public QMainWindow,Ui::MainWindow
{
		Q_OBJECT
		UMSDatabase *_dbase;
		
		QMap<QString,QString> mapNames(QStandardItem *pitem);
		QLabel *_slabServer;
		QLabel *_slabUser;
		QLabel *_slabDatabase;
		
		
		QueryWidget *currentQueryWidget();
		UserWidget *currentUserWidget();
		QWidget *currentTab();
		
		//QStandardItem *_itemUsers;
		
		//StructProxyModel *_filterStructModel;
	
		void loadStructFromFile(const QString &fname);
		
		void loadCubes(QStandardItem *item,QDomElement *root);
		void loadCoordinates(QStandardItem *pItem,QDomElement *root);
		QWidget* tabFromPosition(const QTabWidget *widget, const QPoint &point);
		void setTabTextForStruct(StructWidget *sw); //< обновляет заголовок таба для структуры.
		//void loadStruct(const QDomDocument &doc);
		
		//void createStructModel(); //< создает модель дерева правки структуры базы данных.
		
		QString nodeValue(const QString &name,const QDomElement &root); // значение дочерней ветви.
		
		void showUserWidget(const QString &username);
		//QDomElement userNode(const QString &name);
		int userWidgetIndexByUserName(const QString &username);
		//QString generateCrdInserts(QStandardItem *pItem,int level=0); //< 
		void checkShowTabBar();
		// создание меню для кнопок мастера.
		void createMenuDatabase();
		void createMenuQueries();
		void createMenuUsers();
		void createMenuImport();
		
		void test1(); //< тест выполнения запроса select к БД.
		void test2(); //< тест показа пользователей.
	private slots:
		QueryWidget *on_actionNewQuery_triggered();
		void on_actionLoadStructDB_triggered();
		void on_actionLoadUsersFromFile_triggered();
		void on_tabWidget_tabCloseRequested(int index);
		void on_actionShowUsers_triggered();
		//void on_pbSelectDatabase_clicked();
		//void on_treeStruct_activated(const QModelIndex &index);
		void on_actionCreateNewUser_triggered();
		void on_actionImportFromCSV_triggered(); //< импорт из файла csv
		void on_actionLoadBDProjectFromServer_triggered(); //< загрузить проект структуры БД с сервера.
		void on_actionOpenQuery_triggered(); //< загрузка запросов из файла.
		//void on_treeStruct_customContextMenuRequested(QPoint pt);
		void openQueryWindow(const QString &query);//< открывает таб с запросом.
		void openBase(const QString &dbname);
		//void generateInsert(); // генерация mql-запроса insert
		//void generateSelect();
		//void generateSetCurrentDatabase();
		StructWidget *newStruct();
		void execQuery();
		void savedQueries(); //< сохраненые запросы.
		void loadStructFromFile();
			
		//void insertWord(QStandardItem *item);
		void about();
		void closeCurrentTab();
		void chooseServer();
		void updateStatusBar();
		void structSaved();
		void userSaved(QString,QDomElement); //< сохранить пользователя
		void tabCloseRequested(int);
    public:
        MainWindow(UMSDatabase *dbase);
		void setDatabase(UMSDatabase *dbase);
	protected:
		bool eventFilter(QObject *object, QEvent *e);
};

#endif // MAINWINDOW_H
